import os
import imghdr
import numpy as np
from image_utils import logging
from skimage import io  # skimage.io模块用于读写图像文件

def load_image(image_path, as_gray=False):
    """从文件中载入图像"""
    try:
        logging.info(f"开始载入图像: {image_path}")
        
        if not os.path.exists(image_path):
            raise FileNotFoundError(f"文件不存在: {image_path}")
            
        if not imghdr.what(image_path):
            raise ValueError(f"文件不是有效的图像格式: {image_path}")
            
        img = io.imread(image_path, as_gray=True) if as_gray else io.imread(image_path)
        
        # 确保图像数据类型为uint8
        if img.dtype != np.uint8:
            if img.max() <= 1.0:
                img = (img * 255).astype(np.uint8)
            else:
                img = img.astype(np.uint8)
        
        logging.info(f"成功载入图像: {image_path}, 尺寸: {img.shape}")
        return img
        
    except Exception as e:
        logging.error(f"载入图像时发生错误: {str(e)}")
        raise

def save_image(image, save_path, format='png'):
    """
    将图像保存到文件
    :param image: 要保存的图像数据
    :param save_path: 保存文件的路径
    :param format: 保存图像的格式,默认为'png'
    """
    try:
        logging.info(f"开始保存图像: {save_path}")  # 记录开始保存图像的日志
        
        # 检查图像数据是否有效
        if image is None:
            logging.error("无法保存空图像")
            return False
            
        # 检查保存目录是否存在
        save_dir = os.path.dirname(save_path)
        if save_dir and not os.path.exists(save_dir):
            os.makedirs(save_dir)
            
        # 保存图像
        io.imsave(save_path, image)
        
        # 验证保存是否成功
        if not os.path.exists(save_path):
            logging.error(f"图像保存失败: {save_path}")
            return False
            
        logging.info(f"图像成功保存在: {save_path}")
        logging.info(f"保存格式: {format}")
        logging.info(f"保存尺寸: {image.shape}")
        return True
    except Exception as e:
        logging.error(f"保存图像时发生错误: {e}", exc_info=True)  # 记录完整错误堆栈
        return False
